package bbalgae;

public class J22_privateconstructor {

	/*
	 * private으로 선언된 생성자 일반적으로 모든 생성자는 public 이어야함 클래스에 대한 객체를 생성하려면 반드시 필요한 것이
	 * 생성자이기 때문임
	 * 
	 * 하지만, 어떤 생성자는 private으로 만들어서 new연션자로 그들의 클래스가 객체화되지 못하게 하는 경우도 있다. private
	 * 생성자를 사용한 클래스를 singleton 클래스라 부름
	 * 
	 * 생성자는 private으로  할경우 객체변수는 private static으로 선언해서 클래스의 객체를 메소드를 통해  접근가능..
	 */

	public static void main(String[] args) {

		
		/*
		 * Singleton one = new Singleton(); Singleton two = new Singleton();
		 * Singleton three = new Singleton();
		 */
		Singleton one = Singleton.newInstance();
		Singleton two = Singleton.newInstance();
		Singleton three = Singleton.newInstance();

	}

}

class Singleton {
	
	private static Singleton object = null;
	//object는 static으로 선언되었기 때문에 단 하나의 객체만 생성가능
	
	// public Singleton() {System.out.println("객체가 하나 만들어졌어요"); 일반적인 생성자
	private Singleton() {
		System.out.println("객체가 하나 만들어졌어요");// 특수한 생성자

	}

	/*
	 * public static Singleton newInstance() { Singleton object = new
	 * Singleton(); return object; //생성자는 일반메서드를 통해서만 호출 }
	 */
	
	public static Singleton newInstance(){
		
		if(object==null)object = new Singleton();
		// 객체가 만들어지지 않았다면 (object == null), 객체를 하나 생성함(new Singleton)
		return object;
	}
	
		
}
